package com.woniuxy.portal.config.cors;

import com.woniuxy.portal.config.interceptor.JwtInterceptor;
import com.woniuxy.portal.config.interceptor.UrlProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@EnableConfigurationProperties(UrlProperties.class)
@Configuration
@Slf4j
public class BookMvcConfig implements WebMvcConfigurer {

    // 允许的请求来源
    @Value("${portal.allow-origins}")
    private String[] allowedOrigins;

    // 图片的访问地址
    @Value("${portal.image-path}")
    private String imagePath;

    private final JwtInterceptor jwtInterceptor;
    private final UrlProperties urlProperties;

    @Autowired
    public BookMvcConfig(JwtInterceptor jwtInterceptor, UrlProperties urlProperties) {
        this.jwtInterceptor = jwtInterceptor;
        this.urlProperties = urlProperties;
    }

    /**
     * 允许所有类型的请求来自 http://localhost:9000 服务器
     * 并且允许的请求类型包括：GET、POST、DELETE、OPTIONS
     * 允许与凭据一起发送请求，不然不能使用Cookie，导致会话不能使用
     */
//    @Override
//    public void addCorsMappings(CorsRegistry registry) {
//        registry.addMapping("/**")    // 允许所有访问地址
//                .allowedOrigins(allowedOrigins) // 允许哪些服务器地址
//                .allowedMethods("*")            // 允许所有的请求类型
//                .allowedHeaders("*")            // 允许所有的请求头
//                .allowCredentials(true)         // 允许与凭据一起发送请求，Cookie可以跨域
//                .exposedHeaders("*");           // 允许返回的头信息
//    }

    /**
     * 配置静态资源处理器，将/images/**路径的请求映射到指定的图片存储路径
     *
     * @param registry 资源处理器注册器，用于添加资源处理规则
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 配置资源的访问地址：http://localhost:8080/images/xxx.jpg
        // 将/images/**路径的请求映射到imagePath指定的物理路径
        registry.addResourceHandler("/images/**").addResourceLocations(imagePath);
    }

    /**
     * 添加拦截器配置
     *
     * @param registry 拦截器注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 配置：拦截的资源、放行的资源
        List<String> whiteNames = urlProperties.getWhiteNames();
        registry.addInterceptor(jwtInterceptor)
                .addPathPatterns("/**") // 拦截所有资源
                .excludePathPatterns(whiteNames); // 放行的资源
    }

}
